﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using ASPPanificadora.controller;
using ASPPanificadora.classes;
using ASPPanificadora.Funcoes;

namespace ASPPanificadora.Telas
{
    public partial class CompraView : System.Web.UI.Page
    {
        IFornecedorController fornecedorController;
        ICompraController compraController;
        Compra compra = new Compra();
        IList<ItemCompra> listaItemCompra;
        ItemCompra itemCompra = new ItemCompra();
        IAbrirFecharCaixaController abrirFecharCaixaController;
        
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Session["TipoUsuario"] == null || !ControleAcessoTela.ConfirmaAcessoTela("CompraView", Session["TipoUsuario"]))
                Response.Redirect("~/Default.aspx");


            ((SiteCadastro)Page.Master).btnSalvar.Click += new EventHandler(Salvar);
            ((SiteCadastro)Page.Master).btnLimpar.Click += new EventHandler(LimparCampos);
            ((SiteCadastro)Page.Master).btnPesquisa.Visible = false;
            ((SiteCadastro)Page.Master).txtPesquisaCodigo.Visible = false;
            ((SiteCadastro)Page.Master).lblPesquisarNome.Visible = false;
            ((SiteCadastro)Page.Master).lblPesquisar.Visible = false;

            abrirFecharCaixaController = new AbrirFecharCaixaController();
            if (!abrirFecharCaixaController.VerificaCaixaAberto())
            {
                Response.Redirect("~/Default.aspx");
            }

            if (!IsPostBack)
            {
                fornecedorController = new FornecedorController();
                IList<Fornecedor> listaFornecedor = fornecedorController.RecuperarAtivos();

                ddlListaFornecedor.Items.Add(new ListItem("Selecione", "0"));

                foreach (Fornecedor fornecedor in listaFornecedor)
                {
                    ddlListaFornecedor.Items.Add(new ListItem(fornecedor.NomeFornecedor, fornecedor.Id.ToString()));
                }

                Session.Add("ListaItemPedido", null);
                Session.Add("ListaItemCompra", null);

            }
        }

        protected void ExibeMensagem(string msg)
        {
            ((SiteCadastro)Page.Master).txtResultado.Text = msg;
        }

        protected void Salvar(object sender, EventArgs e)
        {
            List<ItemCompra> listaItemCompra = (List<ItemCompra>)Session["ListaItemCompra"];
            List<ItemPedido> listaItemPedido = (List<ItemPedido>)Session["ListaItemPedido"];
            IList<ItemPedido> listaItemPedidoEntregue = listaItemPedido.Where(a => a.Entregue == true).ToList();
            if (listaItemCompra.Count > 0)
            {   
                string msg = "";
                try
                {
                    compra = new Compra();
                    compra.IdFornecedor = Convert.ToInt32(ddlListaFornecedor.SelectedValue);
                    compra.QtdeItens = listaItemCompra.Count;
                    compra.IdUsuario = Convert.ToInt32(Session["IdUsuario"].ToString());
                    compra.DataCompra = DateTime.Now;
                    compra.ItemCompra = listaItemCompra;
                    double valorTotal = new double();
                    foreach (ItemCompra item in listaItemCompra)
                    {
                        valorTotal += Convert.ToDouble(item.Qtde) * item.ValorUnitario;
                    }
                    compra.ValorTotalCompra = valorTotal;
                    compra.FechamentoCompra = false;

                    compraController = new CompraController();

                    msg = compraController.Salvar(compra, listaItemPedidoEntregue);
                    txtCodigo.Text = compra.Id.ToString();
                }
                catch (Exception ex)
                {
                    msg = "Erro: " + ex.Message.ToString();
                }
                finally
                {
                    ((SiteCadastro)Page.Master).txtPesquisaCodigo.Text = null;
                    ExibeMensagem(msg);
                }
            }
        }
        
        protected void LimparCampos(object sender, EventArgs e)
        {
            ddlListaFornecedor.Enabled = true;
            ddlListaFornecedor.SelectedIndex = 0;
            dtlProdutosPendentes.DataSource = null;
            dtlProdutosPendentes.DataBind();
            Session["ListaItemPedido"] = null;
            Session["ListaItemCompra"] = null;
            RedefinirFormItemPedido(true);
        }

        protected void ddlListaFornecedor_SelectedIndexChanged(object sender, EventArgs e)
        {
            ddlListaFornecedor.Enabled = false;
            AtualizaProdutosPendentes();
        }

        private bool ValidaCamposPesquisa()
        {
            if (((SiteCadastro)Page.Master).txtPesquisaCodigo == null || ((SiteCadastro)Page.Master).txtPesquisaCodigo.Text.Equals("") || ((SiteCadastro)Page.Master).txtPesquisaCodigo.Text.Equals("0"))
                return true;
            else
                return false;
        }

        private void AtualizaProdutosPendentes()
        {
            compraController = new CompraController();
            IList<ItemPedido> listaItemPedido = compraController.ListaItensPendentesPorFornecedor(Convert.ToInt32(ddlListaFornecedor.SelectedValue));
            dtlProdutosPendentes.DataSource = listaItemPedido;
            dtlProdutosPendentes.DataBind();
            Session["ListaItemPedido"] = listaItemPedido;
        }

        protected void btnAdicionar_Click(object sender, EventArgs e)
        {
            Button btn = (Button)sender;

            if (!(btn.CommandArgument.Equals("0") || btn.CommandArgument.Equals("")))
            {
                int idItemPedido = Convert.ToInt32(btn.CommandArgument);
                int qtdeEfetiva = Convert.ToInt32(txtQtdeEfetiva.Text);
                double valorUnitario = Convert.ToDouble(txtValorUnitario.Text);

                if (idItemPedido != 0 && qtdeEfetiva != 0 && valorUnitario != 0)
                {
                    if (Session["ListaItemCompra"] != null)
                    {
                        List<ItemCompra> listaItemCompra = (List<ItemCompra>)Session["ListaItemCompra"];
                        var itemCompraTemp = listaItemCompra.Where(a => a.IdItemPedido == idItemPedido).FirstOrDefault();
                        if (itemCompraTemp != null)
                        {
                            itemCompraTemp.Qtde = qtdeEfetiva;
                            itemCompraTemp.ValorUnitario = valorUnitario;
                            Session["ListaItemCompra"] = listaItemCompra;
                        }
                        else
                        {
                            List<ItemPedido> listaItemPedido = (List<ItemPedido>)Session["ListaItemPedido"];
                            var itemPedidoTemp = listaItemPedido.Where(a => a.Id == idItemPedido).FirstOrDefault();
                            if (listaItemCompra == null)
                                listaItemCompra = new List<ItemCompra>();

                            listaItemCompra.Add(new ItemCompra()
                            {
                                IdCompra = Convert.ToInt32(txtCodigo.Text),
                                IdItemPedido = idItemPedido,
                                IdProduto = itemPedidoTemp.IdProduto,
                                DataPrevista = itemPedidoTemp.DataPrevista,
                                DataEntrega = DateTime.Now,
                                Qtde = qtdeEfetiva,
                                ValorUnitario = valorUnitario,
                                Produto = itemPedidoTemp.Produto,
                                ItemPedido = itemPedidoTemp
                            });
                            Session["ListaItemCompra"] = listaItemCompra;
                            itemPedidoTemp.Entregue = true; 
                            dtlProdutosPendentes.DataSource = listaItemPedido;
                            dtlProdutosPendentes.DataBind();
                            Session["ListaItemPedido"] = listaItemPedido;
                        }
                    }
                    else
                    {
                        List<ItemPedido> listaItemPedido = (List<ItemPedido>)Session["ListaItemPedido"];
                        var itemPedidoTemp = listaItemPedido.Where(a => a.Id == idItemPedido).FirstOrDefault();
                        if (listaItemCompra == null)
                            listaItemCompra = new List<ItemCompra>();

                        listaItemCompra.Add(new ItemCompra()
                        {
                            IdCompra = Convert.ToInt32(txtCodigo.Text),
                            IdItemPedido = idItemPedido,
                            IdProduto = itemPedidoTemp.IdProduto,
                            DataPrevista = itemPedidoTemp.DataPrevista,
                            DataEntrega = DateTime.Now,
                            Qtde = qtdeEfetiva,
                            ValorUnitario = valorUnitario,
                            Produto = itemPedidoTemp.Produto,
                            ItemPedido = itemPedidoTemp
                        });
                        Session["ListaItemCompra"] = listaItemCompra;
                        itemPedidoTemp.Entregue = true;
                        dtlProdutosPendentes.DataSource = listaItemPedido;
                        dtlProdutosPendentes.DataBind();
                        Session["ListaItemPedido"] = listaItemPedido;
                    }
                }
                AtualizaValorTotal();
            }
        }

        protected void dtlProdutosPendentes_ItemCommand(object source, DataListCommandEventArgs e)
        {
            if (e.CommandName == "Selecionar" && Session["ListaItemPedido"] != null)
            {
                int idItemPedido = Convert.ToInt32(e.CommandArgument.ToString());
                List<ItemPedido> listaItemPedido = (List<ItemPedido>)Session["ListaItemPedido"];
                ItemPedido item = listaItemPedido.Where(a => a.Id == idItemPedido).FirstOrDefault();
                

                if (Session["ListaItemCompra"] != null)
                {
                    List<ItemCompra> listaItemCompra = (List<ItemCompra>)Session["ListaItemCompra"];
                    itemCompra = listaItemCompra.Where(a => a.IdItemPedido == idItemPedido).FirstOrDefault();
                }

                if (itemCompra == null || itemCompra.IdItemPedido == 0)
                {
                    itemCompra = new ItemCompra()
                    {
                        IdCompra = Convert.ToInt32(txtCodigo.Text),
                        IdItemPedido = idItemPedido,
                        IdProduto = item.IdProduto,
                        DataPrevista = item.DataPrevista,
                        DataEntrega = DateTime.Now,
                        Qtde = item.Qtde,
                        Produto = item.Produto,
                        ItemPedido = item
                    };
                }
                RedefinirFormItemPedido();
            }
        }

        private void RedefinirFormItemPedido(bool limpar = false)
        {
            try
            {
                if (limpar == false)
                {
                    lblProduto.Text = itemCompra.Produto.NomeProduto;
                    lblQtdePrevista.Text = itemCompra.ItemPedido.Qtde.ToString();
                    lblDataEntregaPrevista.Text = itemCompra.DataPrevista.ToString();
                    txtQtdeEfetiva.Text = itemCompra.Qtde.ToString();
                    txtValorUnitario.Text = itemCompra.ValorUnitario.ToString();
                    btnAdicionar.CommandArgument = itemCompra.IdItemPedido.ToString();
                }
                else
                {
                    lblProduto.Text = string.Empty;
                    lblQtdePrevista.Text = string.Empty;
                    lblDataEntregaPrevista.Text = string.Empty;
                    txtQtdeEfetiva.Text = string.Empty;
                    txtValorUnitario.Text = string.Empty;
                    btnAdicionar.CommandArgument = "0";
                }
            }
            catch (Exception ex)
            {
                ExibeMensagem(ex.Message.ToString());
            }
        }

        private void AtualizaValorTotal()
        {
            if (Session["ListaItemCompra"] != null)
            {
                List<ItemCompra> listaItemCompra = (List<ItemCompra>)Session["ListaItemCompra"];
                double valorTotal = new double();
                foreach (ItemCompra item in listaItemCompra)
                {
                    valorTotal += Convert.ToDouble(item.Qtde) * item.ValorUnitario;
                }
                txtValorTotal.Text = valorTotal.ToString();
            }
            else
                txtValorTotal.Text = "0,00";
        }
    }
}